Terraform 官方文档配置导致的 DB Proxy 故障案例

起因

在搭建新环境时,我们选择了 OpenTofu——这是在 Terraform 更改了 license 之后从 Terraform 代码库分支并且开放源码的工具——用于构建VPC、RDS、Redis等基础设施。

但当基础设施就位、开始部署应用程序时,问题出现了。每次部署都不成功,查看日志说是 JDBC 相关错误,DB Proxy 的日志中充斥着诸多 “internal error”,却若隐若现关于具体错误原因的描述。尝试直接通过 MySQL 客户端连接 DB Proxy 时,大多数命令执行都引发错误(help 命令除外)提示:

ERROR 1105 (HY000): Unknown error

错误截图参见:

问题排查

经过一系列尝试后,我联系了 AWS 的客服,并提交了一个 case。经过一整天(案例仍在 “work in progress”)等待后,AWS 给出了反馈。在一串冗长的信息之后,技术支持终于指出了潜在有用的信息,提到如果 parameters 中的 init_query 被设置为 "SET x=1, y=2" 时,可能会触发这个问题。

网络上也有人分享了 类似的困境

这让我想起在 OpenTofu 中配置 DB Proxy(其实是在资源 aws_db_proxy_default_target_group 里) 时,我确实设定了 init_query = "SET x=1, y=2"。为什么会这样呢?因为这是遵循了 Terraform(OpenTofu)官方文档给出的示例:Resource: aws_db_proxy_default_target_group,文档截图如下:

尽管我仔细阅读了关于 init_query 的文档说明,做过 MySQL DBA 的我也明确知道 init_query 的含义和用途,但出于对官方文档示例的信赖,还是采纳了这一配置。

解决方案

解决问题过程颇费周折。初始时,我尝试在 db_proxy.tf 中注释掉 init_query 相关行,并执行 tofu play; tofu apply 进行更改。尽管提示显示已变更,web 控制台的显示却未有更新。于是,我又把 init_query 设置为空值后重新运行命令。提示虽然依旧显示已修改,但是 web 控制台的状态仍然未变。最终,我不得不直接在 web 控制台进行修改才得以生效。之后,再次运行 tofu plan 确认 Terraform(OpenTofu) 状态与控制台同步,这才安心。

结语

本案例告诉我们,即便是官方文档,也不应该盲目信任。重要的是深入理解配置中每个参数的具体含义和必要性,否则可能会带来意想不到的麻烦。

迷惑性的问题

这个问题起初可能并未被触发,因为最初(用 OpenTofu)构建完 DB Proxy 后我肯定进行了连接测试的,当时并未发现问题。而且就在部署问题应用(java)之前,不论是 Python 还是 Node.js 应用,均未出现部署错误( Java 项目可能最初出错是因为角色没有 VPC access 权限,但权限解决后部署时还报错则是因为那个时候我已经触发了 DB Proxy 的配置问题让其服务几乎不可用了)。

DB Proxy 正式被触发故障是在尝试将另一环境的 RDS 表结构导入时。我是通过 DB Proxy 来进行数据导入的,当时未导入完成便报错失败,从此任何命令(除了 help 命令)都返回错误:ERROR 1105 (HY000): Unknown error。这次故障被触发的原因和机理也非常值得研究。